SQlite源码分析

初始化互斥锁

从源代码可以看到,SQlite在win32下的锁,用的是系统中的临界区,且全部为二元临界区,一把锁,即是一个互斥锁,故本文开头也时常说是互斥体,如有不妥,纯属无知,还请见谅。

SQlite总共有六个临界区,每把锁有各自用途,但纯粹从mutex_w32.c这个文件来看,无法分析每把锁的具体用途,以至于对图SQLite锁的状态以及状态的转换(见2.2锁的流程)产生误读,因为单纯从mutex_w32.c这个角度来看,无法构造出每个步骤的锁的转换流程,就如同低维生物无法理解高维世界,底层只提供调用方式,管中窥豹,无法窥见程序全貌。锁的状态以及状态的转换,具体对应代码实现应该是在os_win.c。

互斥锁初始化如下

static int winMutexInit(void){
  /* The first to increment to 1 does actual initialization */
//  PVOID *Destination,
//  PVOID Exchange,
//     PVOID Compera
if( InterlockedCompareExchange(&winMutex_lock, 1, 0)==0 ){//2元临界区 一次只进一个
    int i;
    for(i=0; i<ArraySize(winMutex_staticMutexes); i++){
#if SQLITE_OS_WINRT
      InitializeCriticalSectionEx(&winMutex_staticMutexes[i].mutex, 0, 0);  //OS_WINRT 系统才有
#else
      InitializeCriticalSection(&winMutex_staticMutexes[i].mutex);//初始化6个临界区
#endif
    }
    winMutex_isInit = 1;//初始化完成后赋值1
  }else{
    /* Someone else is in the process of initing the static mutexes */
    while( !winMutex_isInit ){
      sqlite3_win32_sleep(1);//2元临界区,进不了的睡觉
    }
  }
  return SQLITE_OK;
}